from django.shortcuts import render, redirect
from django.views import View
from django import http
import json

# ————————————————request部分———————————————————
class QSParamView(View):
    """
    测试提取查询字符串
    GET POST http://127.0.0.1:8000/querystring/?name=zxc&age=18
    """
    def get(self, request):
        """
        提取请求地址地址中的查询参数（?name=zxc&age=18）
        字符串提取方法：request.GET
        :param request:请求对象
        :return:响应对象
        """
        name = request.GET.get("name")
        age = request.GET.get("age")
        print("GET方法提取请求地址中的查询参数name=%s,age=%s" % (name, age))
        return http.HttpResponse("GET方法提取请求地址中的查询参数")

    def post(self, request):
        """
        只要是提取字符串，均是使用request.GET方法，和请求方法无关（GET,POST）
        :param request:
        :return:响应对象
        """
        name = request.GET.get("name")
        age = request.GET.get("age")
        print("POST方法提取请求地址中的查询参数name=%s,age=%s" % (name, age))
        return http.HttpResponse("POST方法提取请求地址中的查询参数")


class FormDataParamView(View):
    """
    提取表单类型请求体参数：http://127.0.0.1:8000/formdata/
    请求体中传递name和password参数
    """
    def post(self, request):
        """
        表单类型请求体使用request.POST方法提取
        :param request:
        :return:响应对象
        """
        name = request.POST.get("name")
        password = request.POST.get("password")
        print("表单类型请求体数据name=%s,password=%s" % (name, password))
        return http.HttpResponse("表单类型请求体数据")


class JsonParamView(View):
    """测试提取非表单类型的请求体数据：JSON
    POST http://127.0.0.1:8000/json/
    JSON中传递name、password
    方式：request.body
    """
    def post(self, request):
        # 获取客户处传递过来的json数据
        origin_data = request.body
        json_dict = json.loads(origin_data)
        name = json_dict.get("name")
        password = json_dict.get("password")
        print("Json类型请求体数据name=%s,password=%s" % (name, password))
        return http.HttpResponse("Json类型请求体数据")


class URLParamView(View):
    """
    测试path()提取普通的路径参数
    GET http://127.0.0.1:8000/url_param1/18/
    注意点：提取路径参数是在路由系统里面完成的，因为路径是在路由系统进行处理
    """
    def get(self, request, num):
        """num参数获取Django路由解析器提取的路径中的数据参数
        注意：路由解析器中定义的参数和传入视图中的参数必须一模一样
        """
        print("num:", num)
        return http.HttpResponse("使用django自带路由解析器获取url参数")


class URLParamView2(View):
    """
    测试path()提取路径中的电话号码
    GET http://127.0.0.1:8000/url_param2/18911520667/
    注意点：提取路径参数是在路由系统里面完成的，因为路径是在路由系统进行处理
    """
    def get(self, request, tel):
        print("tel", tel)
        return http.HttpResponse("自定义路由解析器获取url参数")


class URLParamView3(View):
    """
    测试path()提取路径中的电话号码
    GET http://127.0.0.1:8000/url_param2/18911520667/
    注意点：提取路径参数是在路由系统里面完成的，因为路径是在路由系统进行处理
    """
    def get(self, request, tel):
        print("tel", tel)
        return http.HttpResponse("使用re_path()和url()获取路径中参数")


class HeadersParamView(View):
    """
    POST http://127.0.0.1:8000/header/
    postman提交一个json数据测试结果
    """
    def post(self, request):
        result = request.META.get("CONTENT_TYPE")
        print("result:", result)
        return http.HttpResponse("测试获取请求类型")

# ————————————————response部分———————————————————


class ResponseView1(View):
    """
    可以使用django.http.HttpResponse来构造响应对象
    response = HttpResponse(content=响应体, content_type=响应体数据类型，默认为text/html, status=状态码，默认为200)
    HttpResponse可以响应任意类型的数据只需要content和content_type一一对应即可
    """
    def get(self, request):
        """三种return效果一致"""
        # return http.HttpResponse(content="这是HttpResponse", content_type="text/html", status=200)
        # return http.HttpResponse(content="这是HttpResponse")
        return http.HttpResponse("这是HttpResponse")


class JsonResponseView(View):

    def get(self, request):
        json_data = {
            "name" : "yang",
            "age" : 25
        }
        return http.JsonResponse(json_data)

    def post(self, request):
        """
        扩展：如果safe=False，那么JsonResponse可以传递列表数据
        return http.JsonResponse('列表数据', safe=False)
        :param request:
        :return:
        """
        list_data = [
            "yang",25
        ]
        return http.JsonResponse(list_data, safe=False)


class IndexView(View):

    def get(self, request):
        return http.HttpResponse("这就是首页")


class LoginRedirectView(View):

    def post(self, request):
        # 这里可以处理登陆时的一些代码逻辑
        # return  redirect('http://127.0.0.1:8000/index/')
        print("登录成功，跳转首页")
        # 如果用户登录成功后，将用户引导到首页（重定向）
        # 重定向格式redirect('目的地址')
        # 注意：
        # 目的地地址可以写绝对路径：http://127.0.0.1:8000/index/
        # 目的路径还可以写相对路径：/index/（反斜杠一定不能省略，如果写为index/,会报错："GET /login_redirect/index/ HTTP/1.1" 404 4287
        return redirect('/index/')


class LoginRedirectView2(View):
    """如果想用中用到首页的重定向有1000处，然而项目开发过程中首页的路由发生了改变，
    那么使用决定路径和相对路径的就需要修改1000处，效率低下
    实际开发过程中我们会使用路由的别名，动态的解析出该路由中的真实地址
    """
    def post(self, request):
        # 这里可以处理登陆时的一些代码逻辑
        # return  redirect('http://127.0.0.1:8000/index/')
        print("使用反向解析，登录成功，跳转首页")
        # 重定向格式redirect('总路由别名:子路由别名')
        return redirect('request_response:index')
